﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ControlsLib;
using System.Linq.Expressions;
using GestionePolveri2.DAL;
using LinqKit;
using System.Data.Objects;
using FrameworkLib.Filters;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL.FilterBags;

namespace GestionePolveriLib.BL.Filters
{
    public enum LottoNCTypes
    {
        Conforme = 0,
        NCAccettato,
        NCBloccato,
        Tutti
    }

    public class CronologiaFilterBag : FilterBase<Movimenti>, IFilterBase
    {
        public string Operatore { get; set; }
        public string Fornitore { get; set; }
        public string CodicePolvere { get; set; }
        public string CodiceLotto { get; set; }
        public string CausaleScarico { get; set; }
        public string Famiglia { get; set; }
        public string Impianto { get; set; }
        public string ColoriAbbinati { get; set; }
        public int[] CausaleMagazzino { get; set; }
        public string Applicazione { get; set; }
        public LottoNCTypes LottoNCType { get; set; }

        public CronologiaFilterBag()
        {

        }

        public override Expression<Func<Movimenti, bool>> SetUpFilter()
        {
            var predicate = PredicateBuilder.True<Movimenti>();

            if (this.UseDates)
            {
                // aggiungi al filtro il controllo sulla data...
                predicate = predicate.And(im => (EntityFunctions.TruncateTime(im.DataMovimento) >= EntityFunctions.TruncateTime(this.PeriodFrom)) &&
                                                 EntityFunctions.TruncateTime(im.DataMovimento) <= EntityFunctions.TruncateTime(this.PeriodTo));
            }

            //if (!string.IsNullOrWhiteSpace(Famiglia))
            //{
            //    //string[] arInfo = Famiglia.Split(',');
            //    //int[] iarInfo = new int[arInfo.Length];
            //    //for (int i = 0; i < arInfo.Length; i++)
            //    //{
            //    //    iarInfo[i] = Convert.ToInt32(arInfo[i]);
            //    //}

            //    GestionePolveriEntities ctx = new GestionePolveriEntities();
            //    //predicate = predicate.And(im => im.AnagPolveri.FamiglieColoriXPolveri.Famiglie == Famiglia);
            //    predicate = predicate.And(im => ctx.vw_FamiglieColoriXPolveri.Any(o => o.Famiglia.Equals(Famiglia)));
            //}

            //if (!string.IsNullOrWhiteSpace(Applicazione))
            //{
            //    //predicate = predicate.And(im => im.AnagPolveri.FamiglieColoriXPolveri.Applicazione == Applicazione);
            //    GestionePolveriEntities ctx = new GestionePolveriEntities();
            //    predicate = predicate.And(im => ctx.vw_FamiglieColoriXPolveri.Any(o => o.Applicazione.Equals(Applicazione)));
            //}

            switch (LottoNCType)
            {
                case LottoNCTypes.Conforme:
                    predicate = predicate.And(im => im.Lotti.LottiNC == null);
                    break;
                case LottoNCTypes.NCAccettato:
                    predicate = predicate.And(im => (im.Lotti.LottiNC != null) && im.Lotti.LottiNC.FlagNC);
                    break;
                case LottoNCTypes.NCBloccato:
                    predicate = predicate.And(im => (im.Lotti.LottiNC != null) && im.Lotti.LottiNC.FlagBlocco);
                    break;
                case LottoNCTypes.Tutti:
                    break;
                default:
                    break;
            }

            if (!string.IsNullOrWhiteSpace(Impianto))
            {
                string[] arInfo2 = Impianto.Split(',');
                int[] iarInfo2 = new int[arInfo2.Length];
                for (int i = 0; i < arInfo2.Length; i++)
                {
                    iarInfo2[i] = Convert.ToInt32(arInfo2[i]);
                }

                predicate = predicate.And(im => iarInfo2.Contains(im.Impianti.IDImpianto));
            }

            if (CausaleMagazzino != null)
            {
                predicate = predicate.And(im => CausaleMagazzino.Contains(im.CausaliMagazzino.IDCausale));
            }

            if (!string.IsNullOrWhiteSpace(ColoriAbbinati))
            {
                predicate = predicate.And(im => im.AnagPolveri.ComposizioneColori.Any(x => x.AnagColori.CodiceColore == ColoriAbbinati));
            }

            if (!string.IsNullOrWhiteSpace(CodicePolvere))
            {
                predicate = predicate.And(im => im.AnagPolveri.CodicePolvere == CodicePolvere);
            }

            if (!string.IsNullOrWhiteSpace(CodiceLotto))
            {
                predicate = predicate.And(im => im.Lotti.CodLotto == CodiceLotto);
            }

            if (!string.IsNullOrWhiteSpace(Fornitore))
            {
                predicate = predicate.And(im => im.AnagPolveri.AnagFornitori.Descrizione == Fornitore);
            }

            if (!string.IsNullOrWhiteSpace(Operatore))
            {
                predicate = predicate.And(im => im.aspnet_Users.UserName == Operatore);
            }

            if (!string.IsNullOrWhiteSpace(CausaleScarico))
            {
                predicate = predicate.And(im => im.CausaliScarico.CodCausaleScarico == CausaleScarico);
            }

            return predicate;
        }

        public override string ToTraceString()
        {
            string retValue = base.ToTraceString();

            StringBuilder sb = new StringBuilder(base.ToTraceString());

            sb.Append(FilterBagHelper.GetFamigliaTraceString(this.Famiglia));
            sb.Append(FilterBagHelper.GetApplicazioneTraceString(this.Applicazione));
            sb.Append(FilterBagHelper.GetImpiantoTraceString(this.Impianto));

            sb.Append(FilterBagHelper.GetCausaleMagazzinoTraceString(this.CausaleMagazzino));
            sb.Append(FilterBagHelper.GetCausaleScaricoTraceString(this.CausaleScarico));
            sb.Append(FilterBagHelper.GetCodiceLottoTraceString(this.CodiceLotto));
            sb.Append(FilterBagHelper.GetCodiceColoreTraceString(this.ColoriAbbinati));
            sb.Append(FilterBagHelper.GetOperatoreTraceString(this.Operatore));

            sb.Append(FilterBagHelper.GetCodicePolvereTraceString(this.CodicePolvere));
            sb.Append(FilterBagHelper.GetFornitoreTraceString(this.Fornitore));

            return sb.ToString();
        }        
    }
}
